#pragma once

// #include <metalc/meta.h>
#include <compl.h>
#include <dbg.h>
#include <metalc/base/mreq.h>
/* 输入mmeta */
// OU2INFUN(mmeta, cobj_in)
// OU2INFUN(mmeta, cobj_ext)
// typedef void uvoid;
// typedef void cobj_t;
/* cobj从内存块(ptr, size)初始化而来，生成用户可用内存块fvoid*可由用户自由使用 */
/* fptr2ptr (fvoid *) -> (void *, size_t) 实现到用户可使用内存块到真实内存块 */
/* size_t (*mocupysz)() 占用内存块大小*/
/* merge_next */

/* 试想一下释放过程
	fptr -> (ptr, size) 获得内存块真实大小和地址，同时设置free
*/
/* 输出函数 */
STA_OUFUN(cobj)
/* 初始化?用于设置meta信息 */
uvoid* (* const set_cobj)(void *ptr, size_t size, bool_t used);
size_t (* const ptr_getsize)(void *ptr);
/* cobj占用内存大小，外部的话基本是0 */
size_t (* const mocupysz)();
/* 用户进行转换 */
uvoid* (* const ptr2uptr)(void *ptr);
void* (* const uptr2ptr)(uvoid *uptr);
void* (* const get_prev)(void *fst, size_t fstsize);
/* 合并下一个内存 */
size_t (* const merge_next)(void *fst, size_t fstsize);
/* 分割内存 */
void* (*split)(void *ptr, size_t size, size_t new_size, bool_t link_next);
END_OUFUN(cobj)
